import java.math.BigInteger;
import java.util.Calendar;


public class TestBiblioteca implements Test {

	// Atributos
	private String nombre="Biblioteca de Oak";
	private int anioPublicacion;
	
	private Tipo tipo = new Tipo(01, "Ciencia Ficcion");
	private Editorial editorial = new Editorial(01,"Ivrea");
	private Libro libro = new Libro(new BigInteger("9783161484100"),"El Señor de los Anillos",anioPublicacion,editorial,tipo);
	Usuario usuario = new Usuario(31553160, "Gustavo", "Tellefono", 02, 02, 1988, "Chile 256", 2300, "Rafaela", 501904);
	private Biblioteca biblioteca = new Biblioteca(nombre);
	
	
	public static void main(String[] args) {
		TestBiblioteca test = new TestBiblioteca();
		test.ejecutar();
	}
	
	// Formas de ejecución
	public void ejecutar(){
		boolean resultado = true;
		System.out.println("TEST DE LA CLASE BIBLIOTECA");
		
		System.out.print("\t REGISTRAR USUARIO: \t");
		if(!this.comprobarRegistrarUsuario()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		// Comprobamos la busqueda de un usuario
		System.out.print("\t OBTENER USUARIO: \t");
		if(!this.comprobarObtenerUsuario()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		// Comprobamos el atributo Nombre
		System.out.print("\t NOMBRE: \t");
		if(!this.comprobarNombre()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		// Comprobamos la deshabilitacion de un usuario
		System.out.print("\t DESHABILITAR USUARIO: \t");
		if(!this.comprobarDeshabilitarUsuario()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		
		// Comprobamos la modificacion de un usuario
		System.out.print("\t MODIFICAR USUARIO: \t");
		if(!this.comprobarModificarUsuario()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
	
		// Comprobamos la habilitacion de un usuario
		System.out.print("\t HABILITAR USUARIO: \t");
		if(!this.comprobarHabilitarUsuario()){
			resultado=false;
			System.out.println("FALLO");
		}
		else
		{
			System.out.println("OK");
		}
		
		// Veredicto
		if(resultado){
			System.out.println("La clase funciona correctamente");
		}
		else
		{
			System.out.println("Existen Errores en la Clase");
		};
	}

	public boolean ejecutarSilencioso(){
		boolean resultado = true;
		
		// Comprobamos los atributos correspondientes
		if(!this.comprobarRegistrarUsuario()){resultado=false;};
		if(!this.comprobarObtenerUsuario()){resultado=false;};
		if(!this.comprobarNombre()){resultado=false;};
		if(!this.comprobarDeshabilitarUsuario()){resultado=false;};
		if(!this.comprobarModificarUsuario()){resultado=false;};
		if(!this.comprobarHabilitarUsuario()){resultado=false;};
		
		

		return resultado;
	}
	
	
	// Métodos de prueba de cada atributo y metodo
	
/* ################# TESTS PARA COMPROBAR ATRIBUTOS ################# */
	public boolean comprobarNombre(){
		if(this.getBiblioteca().getNombre().compareTo(this.getNombre())==0){
			return true;
		}
		else
		{
			return false;
		}
	}
	
/* ################# TESTS PARA COMPROBAR METODOS DE USUARIO ################# */
	public boolean comprobarRegistrarUsuario(){
		boolean resultado=true;
		int dni = 31553160;
		
		Usuario usuario = new Usuario(dni, "Pinky", "Cerebro", 02, 02, 1988, "Chile 256", 2300, "Rafaela", 501904);
		this.getBiblioteca().registrarUsuario(usuario.getDni(), usuario.getNombre(), usuario.getApellido(), usuario.getFechaNac().get(Calendar.DAY_OF_MONTH), usuario.getFechaNac().get(Calendar.MONTH), usuario.getFechaNac().get(Calendar.YEAR), usuario.getDireccion(), usuario.getCodigoPostal(), usuario.getCiudad(), usuario.getTelefono());
		
		//this.getBiblioteca().obtenerUsuario(dni).imprimirDatos();
		//this.usuario.imprimirDatos();
		
		// Si no coincide se indica falla
		if(!(this.getBiblioteca().obtenerUsuario(dni).equals(usuario))){
			resultado=false;
		}
		
		// Si se puede insertar se indica falla
		if(this.getBiblioteca().registrarUsuario(this.getUsuario().getDni(), this.getUsuario().getNombre(), this.getUsuario().getApellido(), this.getUsuario().getFechaNac().get(Calendar.DAY_OF_MONTH), this.getUsuario().getFechaNac().get(Calendar.MONTH), this.getUsuario().getFechaNac().get(Calendar.YEAR), this.getUsuario().getDireccion(), this.getUsuario().getCodigoPostal(), this.getUsuario().getCiudad(), this.getUsuario().getTelefono())){resultado=false;};
		
		return resultado;
	}
	
	public boolean comprobarModificarUsuario(){
		
		//Creo objeto con nuevos datos
		Usuario usuario = new Usuario(33444111, "Javier", "Videla", 03, 06, 2002, "Por ahi 123", 2301, "Sunchales", 500888);
		
		// Modifico
		this.getBiblioteca().modificarUsuario(this.getUsuario().getDni(), usuario.getDni(), usuario.getNombre(), usuario.getApellido(), usuario.getFechaNac().get(Calendar.DAY_OF_MONTH), usuario.getFechaNac().get(Calendar.MONTH), usuario.getFechaNac().get(Calendar.YEAR), usuario.getDireccion(), usuario.getCodigoPostal(), usuario.getCiudad(), usuario.getTelefono());
		
		// Chequeo
		/*
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getDni()==dniCorrecto){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getNombre().compareTo(nombre)!=0){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getApellido().compareTo(apellido)!=0){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getFechaNac().get(Calendar.DAY_OF_MONTH)!=dia){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getFechaNac().get(Calendar.MONTH)!=mes){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getFechaNac().get(Calendar.YEAR)!=anio ){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getDireccion().compareTo(direccion)!=0){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getCodigoPostal()!=codigoPostal){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getCiudad().compareTo(ciudad)!=0){resultado=false;};
		if(this.getBiblioteca().obtenerUsuario(this.getUsuario().getDni()).getTelefono()!=telefono){resultado=false;};
		*/
		
		return usuario.equals(this.getBiblioteca().obtenerUsuario(usuario.getDni()));
	}
	
	public boolean comprobarDeshabilitarUsuario(){
		int dni = 35531612;
		this.getBiblioteca().registrarUsuario(35531612, "Tavo", "App", 03, 03, 1987, "Av Siempre viva", 2301, "Sunchales", 501905);
		this.getBiblioteca().deshabilitarUsuario(dni);
		return(!this.getBiblioteca().estaHabilitadoUsuario(dni));
	}
	
	public boolean comprobarHabilitarUsuario(){
		int dni = 35531612;
		this.getBiblioteca().habilitarUsuario(dni);
		return(this.getBiblioteca().estaHabilitadoUsuario(dni));
	}
	
	public boolean comprobarObtenerUsuario(){
		Usuario usuario = new Usuario(3503164, "Tavo", "Appo", 04, 04, 1986, "Av Avenida 125", 2300, "Rafaela", 505905);
		this.getBiblioteca().registrarUsuario(usuario.getDni(), usuario.getNombre(), usuario.getApellido(), usuario.getFechaNac().get(Calendar.DAY_OF_MONTH), usuario.getFechaNac().get(Calendar.MONTH), usuario.getFechaNac().get(Calendar.YEAR), usuario.getDireccion(), usuario.getCodigoPostal(), usuario.getCiudad(), usuario.getTelefono());
		return usuario.equals(this.getBiblioteca().obtenerUsuario(usuario.getDni()));
	}
	
/* ################# TESTS PARA COMPROBAR METODOS DE TIPO ################# */
	
	public String getClase() {
		return this.getBiblioteca().getClass().getName();
	}
	
	// Getters And Setters
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public int getAnioPublicacion() {
		return anioPublicacion;
	}

	public void setAnioPublicacion(int anioPublicacion) {
		this.anioPublicacion = anioPublicacion;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

	public Editorial getEditorial() {
		return editorial;
	}

	public void setEditorial(Editorial editorial) {
		this.editorial = editorial;
	}

	public Libro getLibro() {
		return libro;
	}

	public void setLibro(Libro libro) {
		this.libro = libro;
	}

	public Biblioteca getBiblioteca() {
		return biblioteca;
	}

	public void setBiblioteca(Biblioteca biblioteca) {
		this.biblioteca = biblioteca;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
}
